#!/bin/bash
# 公共工具函数脚本

# 确保脚本在错误时停止执行
set -e

# 脚本目录路径
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." &>/dev/null && pwd)"

# 加载环境变量
load_env() {
    if [ -f "${PROJECT_ROOT}/.env" ]; then
        source "${PROJECT_ROOT}/.env"
        echo "环境变量已加载"
    else
        echo "错误: 无法找到环境变量文件 ${PROJECT_ROOT}/.env"
        exit 1
    fi
}

# 确保日志目录存在
ensure_log_dir() {
    if [ ! -d "${LOG_DIR}" ]; then
        mkdir -p "${LOG_DIR}"
        echo "创建日志目录: ${LOG_DIR}"
    fi
}

# 日志文件命名：前缀_YYYY-MM-DD.log
get_log_filename() {
    local prefix=$1
    local date_str=$(date +%Y-%m-%d)
    echo "${LOG_DIR}/${prefix}_${date_str}.log"
}

# 日志级别颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # 无颜色

# 日志函数
log_info() {
    local message="$1"
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    echo -e "${timestamp} [INFO] ${message}" | tee -a "${LOG_FILE}"
}

log_success() {
    local message="$1"
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    echo -e "${timestamp} [${GREEN}SUCCESS${NC}] ${message}" | tee -a "${LOG_FILE}"
}

log_warning() {
    local message="$1"
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    echo -e "${timestamp} [${YELLOW}WARNING${NC}] ${message}" | tee -a "${LOG_FILE}"
}

log_error() {
    local message="$1"
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    echo -e "${timestamp} [${RED}ERROR${NC}] ${message}" | tee -a "${LOG_FILE}"
}

# 发送邮件通知
send_email_notification() {
    local subject="$1"
    local body="$2"

    if [ "${ENABLE_EMAIL_NOTIFICATION}" = "true" ]; then
        echo "$body" | mail -s "$subject" \
            -r "${EMAIL_SENDER}" \
            -S smtp="${SMTP_SERVER}:${SMTP_PORT}" \
            -S smtp-auth=login \
            -S smtp-auth-user="${SMTP_USER}" \
            -S smtp-auth-password="${SMTP_PASSWORD}" \
            "${EMAIL_RECIPIENT}"
        log_info "邮件通知已发送至 ${EMAIL_RECIPIENT}"
    else
        log_info "邮件通知已禁用"
    fi
}

# 清理旧日志文件
cleanup_old_logs() {
    if [ -d "${LOG_DIR}" ]; then
        find "${LOG_DIR}" -name "${LOG_FILE_PREFIX}_*.log" -type f -mtime +${LOG_RETENTION_DAYS} -delete
        log_info "已清理超过 ${LOG_RETENTION_DAYS} 天的日志文件"
    fi
}

# 检查命令是否存在
check_command() {
    local cmd="$1"
    if ! command -v "$cmd" &> /dev/null; then
        log_error "命令 '$cmd' 未找到，请先安装"
        exit 1
    fi
}

# 检查PostgreSQL连接
check_postgres_connection() {
    if ! psql -h "${POSTGRES_HOST}" -p "${POSTGRES_PORT}" -U "${POSTGRES_USER}" -d postgres -c "SELECT 1" > /dev/null 2>&1; then
        log_error "无法连接到PostgreSQL数据库服务器: ${POSTGRES_HOST}:${POSTGRES_PORT}"
        return 1
    fi
    return 0
}

# 主要初始化函数
init() {
    load_env
    ensure_log_dir
    LOG_FILE=$(get_log_filename "${LOG_FILE_PREFIX}")
    check_command "psql"
    check_command "pgbackrest"
    cleanup_old_logs
}

# 脚本执行时间计算
start_timer() {
    START_TIME=$(date +%s)
}

end_timer() {
    END_TIME=$(date +%s)
    ELAPSED_TIME=$((END_TIME - START_TIME))
    local hours=$((ELAPSED_TIME / 3600))
    local minutes=$(( (ELAPSED_TIME % 3600) / 60 ))
    local seconds=$((ELAPSED_TIME % 60))
    log_info "总执行时间: ${hours}小时 ${minutes}分钟 ${seconds}秒"
}
